import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.List;

/**
 * 图片类，用来表示组成完整拼图的每个图片
 */
public class Pic extends Actor {
    
    private int value; // 图片的索引值
    private int rotation; // 图片的旋转角度
    GameWorld world = (GameWorld) getWorld();
    // 构造方法，设置图片索引值并加载相关图像
    public Pic(String imagePath, int value, int initialRotation) {
        this.value = value; 
        this.rotation = initialRotation; // 使用传入的初始旋转角度
        setImage(imagePath + (value + 1) + ".png");
        setRotation(rotation); // 设置图片的旋转角度
    }
    
    // 获取图片索引值
    public int getValue() {
        return value;    
    }
    
    // 获取当前旋转角度
    public int getRotation() {
        return rotation;    
    }
    
    public void act() {       
    // 鼠标左键点击移动图片
    if (Greenfoot.mouseClicked(this)) {
        MouseInfo mouseInfo = Greenfoot.getMouseInfo(); // 获取当前鼠标信息
        if (mouseInfo != null && mouseInfo.getButton() == 1) {
            World currentWorld = getWorld(); // 获取当前世界
            if (currentWorld instanceof GameWorld) { // 检查当前世界是否为 GameWorld
                GameWorld world = (GameWorld) currentWorld;
                if (world.getName() == GameWorld.CIALLO) {
                    movePic5x5(); // 当是CIALLO模式时调用5x5移动方法
                } else {
                    movePic3x3(); // 其他模式调用3x3移动方法
                }
                world.getGameStats().incrementMoveCount(); // 增加移动次数
            }
        }
    }

    // 鼠标右键点击旋转图片
    if (Greenfoot.mouseClicked(this)) {
        MouseInfo mouseInfo = Greenfoot.getMouseInfo(); // 获取当前鼠标信息
        if (mouseInfo != null && mouseInfo.getButton() == 3) {
            rotation = (rotation + 90) % 360; // 顺时针旋转90°
            setRotation(rotation); // 更新图片的旋转
        }
    }
}

    
    // 移动图片的方法（3x3）
    private void movePic3x3() {
        // 检查上方是否可移动
        if (getY() > 0 && checkPic(getX(), getY() - 1)) {  
            setLocation(getX(), getY() - 1);
            return;
        }       
        // 检查下方是否可移动
        if (getY() < 2 && checkPic(getX(), getY() + 1)) {  
            setLocation(getX(), getY() + 1);
            return;
        }       
        // 检查左方是否可移动
        if (getX() > 0 && checkPic(getX() - 1, getY())) {  
            setLocation(getX() - 1, getY());
            return;
        }
        // 检查右方是否可移动
        if (getX() < 2 && checkPic(getX() + 1, getY())) { 
            setLocation(getX() + 1, getY());
            return;
        }
    }

    // 移动图片的方法（5x5）
    private void movePic5x5() {
        // 检查上方是否可移动
        if (getY() > 0 && checkPic(getX(), getY() - 1)) {  
            setLocation(getX(), getY() - 1);
            return;
        }       
        // 检查下方是否可移动
        if (getY() < 4 && checkPic(getX(), getY() + 1)) {  
            setLocation(getX(), getY() + 1);
            return;
        }       
        // 检查左方是否可移动
        if (getX() > 0 && checkPic(getX() - 1, getY())) {  
            setLocation(getX() - 1, getY());
            return;
        }
        // 检查右方是否可移动
        if (getX() < 4 && checkPic(getX() + 1, getY())) { 
            setLocation(getX() + 1, getY());
            return;
        }
    }

    // 检查某个方格是否有图片
    private boolean checkPic(int x, int y) {
        List<Pic> pics = getWorld().getObjectsAt(x, y, Pic.class);
        return pics.size() == 0;
    }
    
    // 设置随机角度的方法
    public void setRandomRotation() {
        rotation = Greenfoot.getRandomNumber(4) * 90; // 随机生成旋转角度: 0, 90, 180, 270
        setRotation(rotation); // 设置图片的旋转角度
    }
}
